package com.sojson.project.sys.dept.dao;

import java.util.List;
import java.util.Set;

import org.apache.ibatis.annotations.Param;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sojson.project.sys.dept.entity.dto.DeptDto;
import com.sojson.project.sys.dept.entity.dto.DeptPageDto;
import com.sojson.project.sys.dept.entity.po.Dept;
import com.sojson.project.sys.dept.entity.vo.DeptVo;

/**
 * 部门信息表Dao
 * 
 * @author liu
 * @date 2022-11-18
 */
public interface DeptDao extends BaseMapper<Dept> {

    /**
     * 通过对象查找
     * 
     * @param dto
     * @return
     */
    List<DeptVo> list(DeptDto dto);

    /**
     * 通过对象分页查找
     * 
     * @param dto
     * @return
     */
    List<DeptVo> page(DeptPageDto dto);

    /**
     * 通过对象删除
     * 
     * @param dto
     * @return
     */
    int removeByDto(DeptDto dto);

    /**
     * 清空数据
     * 
     * @return
     */
    int clear();

    /**
     * 通过id查找
     * 
     * @param id
     * @return
     */
    DeptVo findById(String id);

    /**
     * 通过部门名称统计数量
     * 
     * @param dto
     * @return
     */
    int countByName(Dept dto);

    /**
     * 统计未禁用的子部门
     * 
     * @param id
     * @return
     */
    int selectNormalChildrenDeptById(String id);

    /**
     * 查询所有子部门
     * 
     * @param id
     * @return
     */
    List<DeptVo> selectChildrenDeptById(String id);

    /**
     * 统计子部门数量
     * 
     * @param id
     * @return
     */
    int hasChildById(String id);

    /**
     * 根据用户ID查询部门树信息
     *
     * @param userId            用户ID
     * @param deptCheckStrictly 部门树选择项是否关联显示
     * @return 选中部门列表
     */
    List<String> selectDeptListByUserId(@Param("userId") String userId,
        @Param("deptCheckStrictly") boolean deptCheckStrictly);

    /**
     * 根据角色ID查询部门树信息
     *
     * @param roleId            角色ID
     * @param deptCheckStrictly 部门树选择项是否关联显示
     * @return 选中部门列表
     */
    List<String> selectDeptListByRoleId(@Param("roleId") String roleId,
        @Param("deptCheckStrictly") boolean deptCheckStrictly);

    /**
     * 查询部门ID列表
     * 
     * @param dto
     * @return
     */
    Set<String> listIds(DeptDto dto);

    /**
     * 获取用户部门ID
     * 
     * @param userId
     * @return
     */
    String getUserDeptId(String userId);

    /**
     * 获取用户部门树是否关联显示
     * 
     * @param tableName
     * @param userId
     * @return
     */
    boolean getUserDeptCheckStrictlyById(String tableName, String userId);

}